walking_deadfandomcom_pl-20200213-history
Moduł:Navbox
Autor: Nanaki -- Licencja: CC-BY-SA 3.0 -- -- PL: Moduł luźno bazowany na https://en.wikipedia.org/wiki/Module:Navbox, lecz zbudowany od zera. Do użycia w szablonie Navbox. -- EN: Module is loosely based on https://en.wikipedia.org/wiki/Module:Navbox, but built from ground up. For use in Navbox template. local Navbox = {} -- Główny obiekt modułu local p = {} -- Obiekt do zwrócenia -- Zmienne Navbox.args = {} -- Parametry Navbox.rows = 0 -- Ilość list Navbox.columns = 2 -- Ilość kolumn Navbox.rowspan = {} -- Lista elementów, do których należy zastosować atrybut "rowspan" Navbox.colspan = {} -- Lista elementów, do których należy zastosować atrybut "colspan" -- Główna funkcja wywołująca moduł -- function p.navbox(frame) Navbox.args = Navbox.mergeFrames(frame, frame:getParent()) -- Pobiera parametry podane przez #invoke oraz nadpisuje je podanymi do szablonu, który go wywołał if mw.ustring.lower(Navbox.args'Zagnieżdżony' or ) 'tak' then Navbox.nested = true end -- Gdy parametr "Zagnieżdżony" ma wartość "tak" ustawia flagę if mw.ustring.lower(Navbox.args'Paski' or 'tak') 'tak' then Navbox.zebra = true end -- Gdy parametr "Paski" ma wartość "tak" ustawia flagę local state = mw.ustring.lower(Navbox.args'Stan' or '') -- Zmienia zawartość parametru "Stan" na małe litery if state 'rozwinięty' or state 'zwinięty' then -- Włącza zwijanie gdy podany stan to "zwijany" lub "rozwinięty" Navbox.collapsible = true elseif state 'czysty' then -- Wyłącza poprawkę wyśrodkowania tytułu jeśli podany stan to "czysty" Navbox.nofix = true end local tab = Navbox.tab() -- Tworzy główną tabelę szablonu local header = Navbox.header() -- Tworzy nagłówek (parametr "Tytuł") local above = Navbox.above() -- Tworzy wiersz z komórką "Góra" local groups = Navbox.groups() -- Tworzy wiersze z grupami oraz obrazy local below = Navbox.below() -- Tworzy wiersz z komórką "Dół" tab:wikitext('\n') -- Dodaje załamanie linii if header then tab:node(header):allDone():wikitext('\n') end -- Dodaje nagłówek do tabeli oraz załamanie linii if above then if header then Navbox.separator(tab, true) end -- Jeśli nagłówek istnieje, dodaje separator na całą szerokość tab:node(above):allDone():wikitext('\n') -- Dodaje komórkę "Góra" do tabeli oraz załamanie linii end if groups then if header or above then Navbox.separator(tab, true) end -- Jeśli nagłówek lub "Góra" istnieją, dodaje separator na całą szerokość tab:node(groups):allDone() -- Dodaje wiersze list end if below then if header or above or groups then Navbox.separator(tab, true) end -- Jeśli nagłówek, "Góra" lub listy istnieją, dodaje separator na całą szerokość tab:node(below):allDone():wikitext('\n') -- Dodaje komórkę "Góra" do tabeli oraz załamanie linii end if header and Navbox.collapsible then -- Jeśli nagłówek istnieje oraz navbox ma być zwijany tab:addClass('mw-collapsible') -- Dodaje klasę wywołującą zwijanie if state 'zwinięty' then tab:addClass('mw-collapsed') end -- Jeśli podany stan to "zwinięty", dodaje klasę odpowiedzialną za ustawienie domyślnie zwiniętego szablonu if (Navbox.args'Rozwiń' or '') ~= '' then tab:attr('data-expandtext', mw.text.encode(Navbox.args'Rozwiń')) end -- Dodaje atrybut zmieniający tekst "Zwiń" jeśli został podany parametr if (Navbox.args'Zwiń' or '') ~= '' then tab:attr('data-collapsetext', mw.text.encode(Navbox.args'Zwiń')) end -- Dodaje atrybut zmieniający tekst "Rozwiń" jeśli został podany parametr end Navbox.spans() -- Dynamiczne atrybuty "rowspan" i "colspan" if Navbox.nested then -- Jeżli zagnieżdżony zwraca tabelę return tostring(tab) end -- W preciwnym wypadku zwraca w nadrzędnym boksie local box = mw.html.create('div'):addClass('navbox') -- Tworzy boks box:node(tab) -- Umieszcza tabelę w nadrzędnym boksie Navbox.css(box, 'Box') -- Aplikuje parametry "Box style" i "Box class" return tostring(box) end -- Funkcja dodająca atrybuty "rowspan" i "colspan" do odpowiednich elementów function Navbox.spans() for _, v in ipairs(Navbox.colspan) do -- Dla każdego elementu na liście "colspan" if v then v:attr('colspan', Navbox.columns) end -- Dodaj atrybut "colspan" z wartością zmiennej "Navbox.columns" end if Navbox.rows > 1 then -- Jeśli ilość list jest większa niż 1 for _, v in ipairs(Navbox.rowspan) do -- Dla każdego elementu na liście "rowspan" if v then v:attr('rowspan', Navbox.rows*2-1) end -- Dodaj atrybut "rowspan" z wartością: liczba wierszy * 2 - 1 end end end -- Funkcja zwracająca numery niepustych list function Navbox.lists() local list = {} -- Pusta lista for k, v in pairs(Navbox.args) do -- Dla każdego podanego argumentu if type(k) 'string' then local match,_,no = mw.ustring.find(k or '', "^Lista (0-9+)$") -- Sprawdza czy nazwa argumentu to "Lista #" if match and v ~= '' then table.insert(list, tonumber(no)) end -- Jeśli tak oraz argument jest niepusty, dodaje numer do listy end end table.sort(list) -- Sortuje listę return list -- Zwraca listę end -- Funkcja tworząca tabelę szablonu function Navbox.tab() local tab = mw.html.create('table'):addClass('navbox-table') -- Tworzy tabelę szablonu Navbox.css(tab, 'Tabela') -- Aplikuje parametry "Tabela style" i "Tabela class" return tab:allDone() end -- Funkcja tworząca nagłówek (parametr "Tytuł") function Navbox.header() if (Navbox.args'Tytuł' or '') ~= '' then -- Sprawdza czy parametr "Tytuł" jest niepusty local header = mw.html.create('tr'):tag('th'):addClass('navbox-header'):attr('scope', 'col') -- Tworzy wiersz oraz komórkę nagłówka local links = Navbox.template(header) -- Tworzy element z linkami do szablonu podanego w parametrze "Szablon" if links then header:node(links) end if (links or Navbox.collapsible) and not Navbox.nofix then header:addClass('center-fix') end -- Pomija klasę poprawiającą wyśrodkowanie jeśli został podany stan "czysty" lub w nagłówku nie ma elementów pływających (brak linków do szablonu i zwijania pozwala na wykorzystanie całej szerokości szablonu Navbox.css(header, 'Tytuł') -- Aplikuje parametry "Tytuł style" i "Tytuł class" header:wikitext('\n' .. Navbox.args'Tytuł' or '') -- Dodaje wartość parametru "Tytuł" na początku nowej linii table.insert(Navbox.colspan, header) -- Dodaje nagłówek do elementów z dynamicznym atrybutem "colspan" return header:allDone() end end -- Dodaje linki do szablonu podanego w parametrze "Szablon" function Navbox.template() if (Navbox.args'Szablon' or '') ~= '' then -- Sprawdza czy parametr "Szablon" jest niepusty local links = mw.html.create('div'):addClass('navbox-template-links plainlinks hlist'):tag('ul') -- Tworzy poziomą listę links:tag('li'):wikitext('.. tostring(mw.uri.fullUrl( 'Template:' .. Navbox.args['Szablon' )) .. ' Z]'):done():tag():wikitext(' ') -- Dodaje link "Zobacz" oraz odstęp po elemencie links:tag('li'):wikitext('.. tostring(mw.uri.fullUrl( 'Template talk:' .. Navbox.args['Szablon' )) .. ' D]'):done():tag():wikitext(' ') -- Dodaje link "Dyskusja" oraz odstęp po elemencie links:tag('li'):wikitext(' ') -- Dodaje link "Linkujące" -- Tworzenie linków zewnętrznych do szablonu i dyskusji ma na celu uniknięcie redlinków w przypadku gdy nie istnieją return links:allDone() end end -- Funkcja tworząca wiersz z komórką "Góra" function Navbox.above() if (Navbox.args'Góra' or '') ~= '' then -- Sprawdza czy parametr "Góra" jest niepusty local above = mw.html.create('tr'):tag('td'):addClass('navbox-above') -- Tworzy wiersz oraz komórkę Navbox.css(above, 'Baza') -- Aplikuje parametry "Baza style" i "Baza class" Navbox.css(above, 'Góra', 'hlist') -- Aplikuje parametry "Góra style" i "Góra class", gdzie domyślna klasa to "hlist" above:wikitext('\n' .. Navbox.args'Góra' or '') -- Dodaje wartość parametru "Góra" na początku nowej linii table.insert(Navbox.colspan, above) -- Dodaje komórkę do elementów z dynamicznym atrybutem "colspan" return above:allDone() end end -- Funkcja tworząca wiersz z komórką "Dół" function Navbox.below(tab) -- tab: tabela, do której ma zostać dodany wiersz if (Navbox.args'Dół' or '') ~= '' then -- Sprawdza czy parametr "Dół" jest niepusty local below = mw.html.create('tr'):tag('td'):addClass('navbox-below') -- Tworzy wiersz oraz komórkę Navbox.css(below, 'Baza') -- Aplikuje parametry "Baza style" i "Baza class" Navbox.css(below, 'Dół', 'hlist') -- Aplikuje parametry "Dół style" i "Dół class", gdzie domyślna klasa to "hlist" below:wikitext('\n' .. Navbox.args'Dół' or '') -- Dodaje wartość parametru "Dół" na początku nowej linii table.insert(Navbox.colspan, below) -- Dodaje komórkę do elementów z dynamicznym atrybutem "colspan" return below:allDone() end end -- Funkcja tworząca wszystkie wiersze list oraz komórki z obrazami function Navbox.groups() local lists = Navbox.lists() -- Funkcja zwracająca numery niepustych list if #lists > 0 then -- Jeśli ilosć list jest większa niż 0 local groups = mw.html.create() -- Tworzy pusty element zawierający listy for _, v in ipairs(lists) do -- Dla każdej niepustej listy if Navbox.rows > 0 then Navbox.separator(groups) end -- Dodaje separator za wyjątkiem pierwszego wywołania local group = Navbox.group(v) -- Tworzenie wiersza listy groups:node(group):allDone():wikitext('\n') end return groups:allDone() end end -- Funkcja tworząca wiersz z listą function Navbox.group(no) -- no: numer grupy parametrów local row = mw.html.create('tr'):attr('data-row', no) -- Tworzy wiersz if Navbox.rows 0 then Navbox.img(row, 'Obraz lewy') end -- Dodaje komórkę lewego obrazu jeśli jest to pierwsza lista (jednorazowo na szablon) local list = mw.html.create('td'):addClass('navbox-list') -- Tworzy komórkę listy, ale jeszcze jej nie dodaje to wiersza if Navbox.zebra then -- Jeśli paski są włączone if Navbox.rows - math.floor(Navbox.rows/2)*2 0 then list:addClass('navbox-odd') else list:addClass('navbox-even') end -- Dodaje klasy wierszy parzystych i nieparzystych end if (Navbox.args' .. no or '') ~= '' then -- Sprawdza czy parametr "Grupa #" jest niepusty local group = row:tag('th'):attr('scope', 'row'):addClass('navbox-group'):wikitext('\n' .. Navbox.args' .. no) -- Tworzy komórkę z nazwą grupy if (Navbox.argsgrupy' or '') ~= '' then -- Jeśli został podany parametr "Szerokość grupy" if not Navbox.widthadded then -- Tylko dla pierwszej grupy group:css('width', Navbox.argsgrupy') -- Dodaje styl "width" do komórki z grupą Navbox.widthadded = true -- Flaga kontrolująca pojedyncze wywołanie end group:addClass('wrap') -- Dodaje klasę umożliwiającą łamanie linii we wszystkich grupach end Navbox.css(group, 'Baza') -- Aplikuje parametry "Baza style" i "Baza class" Navbox.css(group, 'Grupa') -- Aplikuje parametry "Grupa style" i "Grupa class" Navbox.css(group, 'Grupa ' .. no) -- Aplikuje parametry "Grupa # style" i "Grupa # class" else -- Gdy parametr "Grupa #" jest pusty list:addClass('no-group'):attr('colspan', 2) -- Rozszerzenie komórki listy na dwie kolumny end if mw.ustring.sub(Navbox.args' .. no, 1, 26) '